#include"SeqList.h"
//初始化顺序表
void SLInit(SL* ps)
{
    ps->a=NULL;
    ps->capacity=ps->size=0;
}

//销毁顺序表
void SLDestroy(SL* ps)
{
    if(ps->a)
        free(ps->a);
    ps->a=NULL;
    ps->capacity=ps->size=0;
}

//打印
// void SLPrint(SL*ps)
// {
//     assert(ps);
//     for (int i=0;i<ps->size;i++)
//         printf ("%d ",ps->a[i]);
//     printf ("\n");
// }

//判断顺序表空间是否足够,不够就扩容
void SLCheckCapacity(SL*ps)
{
    if(ps->size==ps->capacity)//空间不足，扩容
    {
        //若capacity为0，开辟四个空间，否则开2倍的空间
        int newCapacity =ps->capacity==0 ? 4 : 2*ps->capacity;
        //用一个临时变量接受一下开辟的空间，防止开辟失败数据丢失
        SLDataType *tmp=(SLDataType*)realloc(ps->a,newCapacity*sizeof(SLDataType));
        if (tmp==NULL)
        {
            perror("realloc fail!\n");
            return ;
        }
        //assert(tmp);
        ps->a=tmp;
        ps->capacity = newCapacity;
    }
}

//尾插
void SLPushBack(SL* ps,SLDataType x)
{
    assert(ps);//暴力断言
    SLCheckCapacity(ps);
    ps->a[ps->size++]=x;//直接插入
}
//头插
void SLPushFront(SL* ps,SLDataType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    //历史数据后移一位
    for (int i=ps->size;i>0;i--)
        ps->a[i]=ps->a[i-1];
    ps->a[0]=x;
    ps->size++;
}
//判空
bool SLIsEmpty(SL*ps)
//bool类型只有true(1) false(0) 两个值
{
    assert(ps);
    return ps->size==0;//条件满足，顺序表为空，返回1；不为空返回0；
}
//尾删
void SLPopBack(SL*ps)
{
    assert(ps);
    assert(!SLIsEmpty(ps));
    //assert(ps->size)也可以用来判空
    ps->size--;
}
//头删
void SLPopFront(SL*ps)
{
    assert(ps);
    assert(!SLIsEmpty(ps));
    for (int i=0;i<ps->size-1;i++)
        ps->a[i]=ps->a[i+1];
    ps->size--;
}

//指定位置插入 
void SLInsert(SL*ps,int pos,SLDataType x)
{
    assert(ps);
    assert(pos>=0 && pos<=ps->size);//给pos限制一下
    SLCheckCapacity(ps);
    for (int i=ps->size;i>pos;i--)
        ps->a[i]=ps->a[i-1];
    ps->size++;
    ps->a[pos]=x;
}
//指定位置删除
void SLErase(SL*ps,int pos)
{
    assert(ps);
    assert(!SLIsEmpty(ps));
    assert(pos>=0 && pos<ps->size);
    for (int i=pos;i<ps->size-1;i++)
        ps->a[i]=ps->a[i+1];
    ps->size--;
}
//判断是否有指定元素
// bool SLFind (SL*ps,SLDataType x)
// {
//     assert(ps);
//     for (int i=0;i<ps->size;i++)
//     {
//         if(ps->a[i]==x)
//             return 1;
//     }
//     return 0;
// }